// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Library General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  USA


#include "partida.h"


void Partida::ProcesarCamara(desplazamiento des)
{
	render->camaras->GestionaEvento(des.evento, des.factor_x, des.factor_y, 0);
}

void Partida::ProcesarSeleccion(int selec)
{
	save_state ss = pila_estados.top();
	std::string seleccionar;
	switch(selec) {

		
		case SDLK_ESCAPE:
			if (menu!= NULL)
				if (menu->GetID() == "espera_conex")
					done = 1;
			break;
		case SDLK_1:
			ss.camera_default = CAMARA_PRIMERA_PERSONA;
			ss.estado = EST_JUEGO;
			pila_estados.pop();
			pila_estados.push(ss);
			CambiaEstado ();
			break;
		case SDLK_2:
			ss.camera_default = CAMARA_ESTADIO;
			ss.estado = EST_OBSERVACION;
			pila_estados.pop();
			pila_estados.push(ss);
			CambiaEstado ();
			break;
		case SDLK_3:
			ss.camera_default = CAMARA_AEREA;
			ss.estado = EST_TACTICA;
			pila_estados.pop();
			pila_estados.push(ss);
			CambiaEstado ();
			break;

		case SDLK_PAUSE:
			ss.estado = EST_MENU;
			ss.menu = menu_ingame;
			ss.menu->SeleccionarDefecto();
			pila_estados.push(ss);
			CambiaEstado ();
			break;			

			
		case SDLK_PLUS:
			render->camaras->GestionaEvento(ZOOMMAS, 1, 1, 0);
			break;
		case SDLK_MINUS:
			render->camaras->GestionaEvento(ZOOMMENOS, 1, 1, 0);
			break;
			

		case SDLK_RIGHT:
			seleccionar = menu->GetHighlighted()->OnDir(DIR_DER);
			menu->GetHighlighted()->SetHighlight(0);
			menu->GetContByID(seleccionar)->SetHighlight(1);
			break;

		case SDLK_LEFT:
			seleccionar = menu->GetHighlighted()->OnDir(DIR_IZQ);
			menu->GetHighlighted()->SetHighlight(0);
			menu->GetContByID(seleccionar)->SetHighlight(1);
			break;

		case SDLK_UP:
			seleccionar = menu->GetHighlighted()->OnDir(DIR_ARR);
			menu->GetHighlighted()->SetHighlight(0);
			menu->GetContByID(seleccionar)->SetHighlight(1);
			break;

		case SDLK_DOWN:
			seleccionar = menu->GetHighlighted()->OnDir(DIR_ABA);
			menu->GetHighlighted()->SetHighlight(0);
			menu->GetContByID(seleccionar)->SetHighlight(1);
			break;

		case SDLK_RETURN:
			seleccionar = menu->GetHighlighted()->GetID();
			RealizaAccionesMenu(seleccionar);
			input->Vibra(100);
			break;

		case SDLK_F10:
			ss.estado = EST_PREPROCESO_LANZAMIENTO;
			pila_estados.push(ss);
			break;

		case SDLK_F11:
			pila_estados.pop();
			ss.estado = EST_LANZAMIENTO;
			pila_estados.push(ss);
			break;

			
		// Callbacks de debug
		case SDLK_b:
			for (int i = 0; i < num_estacionarios; i++)
				estacionario[i]->DibujaCon(DRAWING_BOXES);
			break;
		case SDLK_o:
			for (int i = 0; i < num_estacionarios; i++)
				estacionario[i]->DibujaCon(DRAWING_OBJETO);
			break;
		case SDLK_q:
			render->camaras->EligeBox(1);
			break;
		case SDLK_w:
			render->camaras->EligeBox(2);
			break;
		case SDLK_e:
			render->camaras->EligeBox(3);
			break;
		case SDLK_r:
			render->camaras->EligeBox(4);
			break;
		case SDLK_t:
			render->camaras->EligeBox(5);
			break;
		case SDLK_y:
			render->camaras->EligeBox(6);
			break;
		case SDLK_a:
			render->camaras->GestionaEvento(O, 5, 0, 0);
			break;
		case SDLK_d:
			render->camaras->GestionaEvento(E, 5, 0, 0);
			break;
		
	} // switch
	
}

// Callbacks dependiendo de la ID del objeto seleccionado (para menús)
void Partida::RealizaAccionesMenu(std::string seleccionado)
{
	
	if (menu->GetID() == "seleccion_bola")
		ControlarSeleccionBola(seleccionado);
	else if (menu->GetID() == "seleccion_box")
		ControlarSeleccionBox(seleccionado);
	else 
	{

		if (menu->GetID() == "sub_jue_box" || 
		    menu->GetID() == "sub_jue_bola")
			ControlaEntradaJuego(seleccionado);
		if (seleccionado == "boton_salir")
			done = 1;
		// Volver 
		if (seleccionado == "boton_volver")
		{
			menu = menu->GetParent();
			if (menu->GetID() == "sub_jue_box")
				ActualizaValoresEntrada();
		}

		if (seleccionado == "boton_salir_jueg")
			done = 1;


		if (seleccionado == "boton_volver_anterior_estado")
		{
			pila_estados.pop();
			CambiaEstado();
		}

		if (seleccionado == "boton_volver_principal")
			while (!pila_estados.empty())
		{
			save_state ss = pila_estados.top();
			if (ss.menu != NULL)
				if (ss.menu->GetID() == "principal")
			{
				CambiaEstado();
				break;
			}
			pila_estados.pop();
		}
		// Submenus
		if (seleccionado == "boton_ppal_opciones")
		{
			menu = menu->GetSubMenu("sub_opciones");
			menu->SeleccionarDefecto();
		}
		if (seleccionado == "boton_ppal_nuevapartida")
		{
			menu = menu->GetSubMenu("sub_juego");
			menu->SeleccionarDefecto();
		}
		if (seleccionado == "boton_ppal_about")
		{
			menu = menu->GetSubMenu("creditos");	
			menu->SeleccionarDefecto();
		}
		if (seleccionado == "boton_gra_letra")
		{
			menu = menu->GetSubMenu("sub_gra_letra");
			menu->SeleccionarDefecto();
		}
		if (seleccionado == "boton_opc_controles")
		{
			menu = menu->GetSubMenu("ayuda");
			menu->SeleccionarDefecto();
		}
		if (seleccionado == "boton_jue_dos")
		{
			menu = menu->GetSubMenu("sub_jue_box");
			InicializaJuego (2);
			PrepararMenuPartida();
		}
		if (seleccionado == "boton_jue_seis")
		{
			menu = menu->GetSubMenu("sub_jue_box");
			InicializaJuego (6);
			PrepararMenuPartida();
		}
		if (seleccionado == "boton_menu_salir")
		{
			menu = menu->GetSubMenu("menu_salir");
			menu->SeleccionarDefecto();
		}
		if (seleccionado == "boton_bolas_box1")
		{
			_boxActivoMenu = 1;
			menu = menu->GetSubMenu("sub_jue_bola");
			menu->SeleccionarDefecto();
			PrepararMenuPartidaBola();
			ActualizaValoresEntrada();
		}
		if (seleccionado == "boton_bolas_box2")
		{
			_boxActivoMenu = 2;
			menu = menu->GetSubMenu("sub_jue_bola");
			menu->SeleccionarDefecto();
			PrepararMenuPartidaBola();
			ActualizaValoresEntrada();
		}
		if (seleccionado == "boton_bolas_box3")
		{
			_boxActivoMenu = 3;
			menu = menu->GetSubMenu("sub_jue_bola");
			menu->SeleccionarDefecto();
			PrepararMenuPartidaBola();
			ActualizaValoresEntrada();
		}
		if (seleccionado == "boton_bolas_box4")
		{
			_boxActivoMenu = 4;
			menu = menu->GetSubMenu("sub_jue_bola");
			menu->SeleccionarDefecto();
			PrepararMenuPartidaBola();
			ActualizaValoresEntrada();
		}
		if (seleccionado == "boton_bolas_box5")
		{
			_boxActivoMenu = 5;
			menu = menu->GetSubMenu("sub_jue_bola");
			menu->SeleccionarDefecto();
			PrepararMenuPartidaBola();
			ActualizaValoresEntrada();
		}
		if (seleccionado == "boton_bolas_box6")
		{
			_boxActivoMenu = 6;
			menu = menu->GetSubMenu("sub_jue_bola");
			menu->SeleccionarDefecto();
			PrepararMenuPartidaBola();
			ActualizaValoresEntrada();
		}
		if (seleccionado == "boton_gra_letramenos")
			if (_opciones->tam_letra > 5)
		{
			_opciones->tam_letra -= 5;
			int* centro_menu = menu->GetContByID("prueba_texto")->GetCenter();
			menu->GetElemByID("prueba_texto")->SetSize(_opciones->tam_letra);
			menu->GetContByID("prueba_texto")->Pack(centro_menu[0], centro_menu[1]);
			free (hud_ppal);
			hud_ppal = CargaHUD(_opciones->tam_letra);
		}
		if (seleccionado == "boton_gra_letramas")
			if (_opciones->tam_letra < 40)
		{
			_opciones->tam_letra += 5;
			int* centro_menu = menu->GetContByID("prueba_texto")->GetCenter();
			menu->GetElemByID("prueba_texto")->SetSize(_opciones->tam_letra);
			menu->GetContByID("prueba_texto")->Pack(centro_menu[0], centro_menu[1]);
			free (hud_ppal);
			hud_ppal = CargaHUD(_opciones->tam_letra);
		}

		if (seleccionado == "boton_reactivar_ir")
		{
			input->SetIR(0);
			sleep(1);
			input->SetIR(1);
		}


		// Sobre los juegos

		if (seleccionado == "boton_jue_comenzar")
		{
			if (!control_entrada.box1[3] &&
			    !control_entrada.box2[3] &&
			    !control_entrada.box3[3] && 
			    !control_entrada.box4[3] && 
			    !control_entrada.box5[3] && 
			    !control_entrada.box6[3])
			{			
				if (equipo_rojo != NULL)
					free (equipo_rojo);
				if (equipo_azul != NULL)
					free (equipo_azul);
				switch(juego_actual.nroJugadores)
				{
					case 2:
						equipo_rojo = new Equipo("rojo", 0);
						equipo_azul = new Equipo("azul", 0);
						equipo_rojo->SetBox(3);
						equipo_azul->SetBox(4);
						break;
					case 6:
						equipo_rojo = new Equipo("rojo", 1);
						equipo_azul = new Equipo("azul", 1);
						break;

				}

				int box_bblanca = juego_actual.parcial[juego_actual.parcialActual].box_bola_blanca;

				if (box_bblanca == 1 || box_bblanca == 3 || box_bblanca == 5)
					equipo_que_lanza = equipo_rojo;
				else equipo_que_lanza = equipo_azul;

				equipo_que_lanza->SetBox(juego_actual.parcial[
				    juego_actual.parcialActual
				    ].box_bola_blanca);

				InicializaBolasEquipos();

				equipo_que_lanza->SeleccionarBola(juego_actual.parcial[
				    juego_actual.parcialActual
				    ].bola_blanca);

				save_state ss = EstadoCero ();
				ss.hud = hud_ppal;
				ss.estado = EST_JUEGO;
				ss.camera_default = CAMARA_PRIMERA_PERSONA;
				ss.box_camera = equipo_que_lanza->GetBoxSeleccionado() + 1;
				pila_estados.push(ss);
				CambiaEstado();

				hud->GetElemByID("bola")->SetImage(_imgWhiteBall, 100, 100, IMG_ALIGN_ABOVE);
				hud->GetElemByID("box")->SetImage(_imgBox[equipo_que_lanza->GetBoxSeleccionado()], 
				    100, 100, IMG_ALIGN_ABOVE);
				hud->GetElemByID("puntuacion_azul")->SetText("Equipo azul: 0");
				hud->GetElemByID("puntuacion_rojo")->SetText("Equipo rojo: 0");
				hud->GetElemByID("bolas_azules")->SetImage(_imgLostBlue[0], 
				150, 40, IMG_ALIGN_LEFT);
				hud->GetElemByID("bolas_rojas")->SetImage(_imgLostRed[0],
				150, 40, IMG_ALIGN_RIGHT);


				sleep(1);
				input->SetIR(0);
				sleep(1);

			
				sleep(1);
				input->SetIR(1);
				sleep(1);
			}
			else
			{ 
			}

		}
		

	
	}
}



void Partida::ControlarSeleccionBox(std::string seleccionado)
{
	if (seleccionado == "seleccionar_box_1")
	{
		equipo_que_lanza->SetBox(1);
		hud->GetElemByID("box")->SetImage(_imgBox[0], 100, 100, IMG_ALIGN_BELOW);
	}
	if (seleccionado == "seleccionar_box_2")
	{
		equipo_que_lanza->SetBox(2);
		hud->GetElemByID("box")->SetImage(_imgBox[1], 100, 100, IMG_ALIGN_BELOW);
	}
	if (seleccionado == "seleccionar_box_3")
	{
		equipo_que_lanza->SetBox(3);
		hud->GetElemByID("box")->SetImage(_imgBox[2], 100, 100, IMG_ALIGN_BELOW);
	}
	if (seleccionado == "seleccionar_box_4")
	{
		equipo_que_lanza->SetBox(4);
		hud->GetElemByID("box")->SetImage(_imgBox[3], 100, 100, IMG_ALIGN_BELOW);
	}
	if (seleccionado == "seleccionar_box_5")
	{
		equipo_que_lanza->SetBox(5);
		hud->GetElemByID("box")->SetImage(_imgBox[4], 100, 100, IMG_ALIGN_BELOW);
	}
	if (seleccionado == "seleccionar_box_6")
	{
		equipo_que_lanza->SetBox(6);
		hud->GetElemByID("box")->SetImage(_imgBox[5], 100, 100, IMG_ALIGN_BELOW);
	}

	hud->GetElemByID("bola")->SetImage(_imgUndetermined, 100, 100, IMG_ALIGN_BELOW);
	
	PrepararMenuBola();
	menu = selbola;
}

void Partida::ControlarSeleccionBola(std::string seleccionado)
{
	if (seleccionado == "seleccionar_bola_blanda")
	{
		equipo_que_lanza->SeleccionarBola(DUREZA_BLANDA);
		hud->GetElemByID("bola")->SetImage(_imgSoftBall, 100, 100, IMG_ALIGN_BELOW);
	}	
	if (seleccionado == "seleccionar_bola_semi")
	{
		equipo_que_lanza->SeleccionarBola(DUREZA_SEMI);
		hud->GetElemByID("bola")->SetImage(_imgSemiBall, 100, 100, IMG_ALIGN_BELOW);
	}	
	if (seleccionado == "seleccionar_bola_dura")
	{
		equipo_que_lanza->SeleccionarBola(DUREZA_DURA);
		hud->GetElemByID("bola")->SetImage(_imgHardBall, 100, 100, IMG_ALIGN_BELOW);
	}	

	pila_estados.pop();
	pila_estados.top().box_camera = equipo_que_lanza->GetBoxSeleccionado() + 1;
	CambiaEstado();
}


void Partida::ControlaEntradaJuego(std::string seleccionado)
{
	int box[4];
	switch (_boxActivoMenu)
	{
		case 1:
			for (int i = 0; i < 4; i++)
				box[i] = control_entrada.box1[i];
			break;
		case 2:
			for (int i = 0; i < 4; i++)
				box[i] = control_entrada.box2[i];
			break;
		case 3:
			for (int i = 0; i < 4; i++)
				box[i] = control_entrada.box3[i];
			break;
		case 4:
			for (int i = 0; i < 4; i++)
				box[i] = control_entrada.box4[i];
			break;
		case 5:
			for (int i = 0; i < 4; i++)
				box[i] = control_entrada.box5[i];
			break;
		case 6:
			for (int i = 0; i < 4; i++)
				box[i] = control_entrada.box6[i];
			break;
	}
	
	if (seleccionado == "boton_menos_blanda" && box[0] > 0 )
	{
		box[0]--;
		box[3]++;
	}

	if (seleccionado == "boton_mas_blanda" && box[3] > 0)
	{
		box[0]++;
		box[3]--;
	}

	if (seleccionado == "boton_menos_semi" && box[1] > 0 )
	{
		box[1]--;
		box[3]++;
	}

	if (seleccionado == "boton_mas_semi" && box[3] > 0)
	{
		box[1]++;
		box[3]--;
	}
	
	if (seleccionado == "boton_menos_dura" && box[2] > 0 )
	{
		box[2]--;
		box[3]++;
	}

	if (seleccionado == "boton_mas_dura" && box[3] > 0)
	{
		box[2]++;
		box[3]--;
	}


	switch (_boxActivoMenu)
	{
		case 1:
			for (int i = 0; i < 4; i++)
				control_entrada.box1[i] = box[i];
			break;
		case 2:
			for (int i = 0; i < 4; i++)
				control_entrada.box2[i] = box[i];
			break;
		case 3:
			for (int i = 0; i < 4; i++)
				control_entrada.box3[i] = box[i];
			break;
		case 4:
			for (int i = 0; i < 4; i++)
				control_entrada.box4[i] = box[i];
			break;
		case 5:
			for (int i = 0; i < 4; i++)
				control_entrada.box5[i] = box[i];
			break;
		case 6:
			for (int i = 0; i < 4; i++)
				control_entrada.box6[i] = box[i];
			break;
	}

	ActualizaValoresEntrada ();


}


